<?php

class LoadData
{
    /**
     * @param array $result  需要创建sql的数据
     * @param array $info 表信息
     * @param bool $is_table_info 是否需要生产检查表的信息
     * @return bool
     * 根据内容创建对应的sql信息
     */
    public function create_sql($result=[],$info=[],$is_table_info = false){
        set_time_limit(0);
        $sqlStr = '';
        $table = $info['table'];
        //是否需要指定的表头信息
        if($is_table_info){
            $sqlStr = "SET FOREIGN_KEY_CHECKS=0;\r\n";
            $sqlStr .= "DROP TABLE IF EXISTS `$table`;\r\n";
            $create = db()->query('show create table ' . $table);
            $sqlStr .= $create['0']['Create Table'] . ";\r\n";
            $sqlStr .= "\r\n";
        }
        if(!empty($result)){
            $count = count($result);
            foreach($result as $key=>$vo){
                $keys = array_keys($vo);
                $keys = array_map('addslashes', $keys);
                $keys = join('`,`', $keys);
                $keys = "`" . $keys . "`";
                $vals = array_values($vo);

                $vals = array_map('addslashes', $vals);

                $vals = join("','", $vals);
                $vals = "'" . $vals . "'";
//                $sqlStr .= "insert into `$table`($keys) values($vals);\r\n";
                if($key==0 && $count>1){
                    $sqlStr .= "insert into `$table`($keys) values($vals),";
                }elseif($key==0 && $count==1){
                    $sqlStr .= "insert into `$table`($keys) values($vals);\r\n";
                }elseif($key==($count-1)){
                    $sqlStr .= "($vals);\r\n";
                }else{
                    $sqlStr .= "($vals),";
                }
            }
            mkdirs('./sqls/');
            $filename = './sqls/'.$info['file_name'].'.sql';
            $fp = fopen($filename, 'a+'); //指定文件追加内容
            fputs($fp, $sqlStr);
            fclose($fp);
        }
        return true;
    }

    /**
     * @param string $filename
     * @return bool|\think\response\Json
     * 导入指定的SQL
     */
    public function import_sql($filename='')
    {
        set_time_limit(0);
        if(!file_exists('./sqls/'.$filename. ".sql")){
            return json(['code' => -1, 'data' => '', 'msg' => '数据不存在!']);
        }
        $sqls = $this->analysisSql('./sqls/'.$filename.'.sql');
//        echo json_encode($sqls);die;
        foreach($sqls as $key=>$sql){
            db()->query($sql);
        }
        unlink('./sqls/'.$filename.'.sql');
        return true;
    }
    public function  del_sql($filename=''){
        unlink('./sqls/'.$filename.'.sql');
        return true;
    }
    /**
     * 解析sql文件
     * @param $file
     * @return array
     */
    public function analysisSql($file)
    {
        // sql文件包含的sql语句数组
        $sqls = array ();
        $f = fopen ( $file, "rb" );
        // 创建表缓冲变量
        $create = '';
        while ( ! feof ( $f ) ) {
            // 读取每一行sql
            $line = fgets ( $f );
            // 如果包含空白行，则跳过
            if (trim ( $line ) == '') {
                continue;
            }
            // 如果结尾包含';'(即为一个完整的sql语句，这里是插入语句)，并且不包含'ENGINE='(即创建表的最后一句)，
            if (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) {
                // 将本次sql语句与创建表sql连接存起来
                $create .= $line;
                // 如果包含了创建表的最后一句
                if (preg_match ( '/ENGINE=/', $create, $match )) {
                    // 则将其合并到sql数组
                    $sqls [] = $create;
                    // 清空当前，准备下一个表的创建
                    $create = '';
                }
                // 跳过本次
                continue;
            }
            $sqls [] = $line;
        }
        fclose ( $f );

        return $sqls;
    }
}
